package uebung11;

import java.awt.Color;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

import acm.graphics.GLabel;
import acm.graphics.GRect;
import acm.program.GraphicsProgram;

public class BarChart extends GraphicsProgram {
	private static final long serialVersionUID = 1L;
	private static int WIDTH = 600;
	private static int HEIGHT = 400;
	private static int GAP = 20;

	// Yannic: String[] with labels in the order that should be used to display
	// the BarChart.
	private LinkedList<String> order = null;

	// TODO Fuer die Sortierung sollte entweder ein neues Attribut mit
	// den fuer die Sortierung heranzuziehenden Daten deklariert werden
	// (dann zusammen mit get/set-Methoden), oder die Methode displayDiagram
	// um einen parameter erweitert werden.
	// Passen Sie die Klasse bzw. die Methode entsprechend an.
	// Anschliessend ist die Reihenfolge der Zeichenbefehle in displayDiagram
	// so anzupassen, dass die Eintraege aufsteigend sortiert angezeigt werden.

	// Yannic: Getter/Setter methods for order.
	/**
	 * returns order that is used to display data in BarChart.
	 * 
	 * @return Labels for data in order.
	 */
	public LinkedList<String> getOrder() {
		return order;
	}

	/**
	 * Sets Variable that is used to specify order of the BarChart.
	 * 
	 * @param order
	 *            LinkedList containing Strings with labels in order
	 */
	public void setOrder(LinkedList<String> order) {
		this.order = order;
	}

	/**
	 * Display a bar chart of data. The parameter ymax specifies the scaling of
	 * the y axis.
	 * 
	 * @param data
	 *            the data to display
	 * @param ymax
	 *            the maximum of the y-axis
	 */
	public void displayDiagram(Map<String, Double> data, double ymax) {
		// clean the canvas
		removeAll();

		// compute bar width
		int barWidth = (WIDTH - GAP * (data.size() - 1)) / data.size();

		// compute bar unit height
		double barUnitHeight = HEIGHT / ymax;

		// x of lower left corner of next bar
		int x = 0;
		setBackground(Color.WHITE);

		// If no order was given, use the order in map.
		if (order == null)
			order = new LinkedList<String>(data.keySet());

		for (Object o : order) {
			if (data.containsKey(o)) {
				data.get(o);
				Double v = (Double) data.get(o);
				GRect bar = new GRect(barWidth, barUnitHeight * v);
				bar.setColor(Color.BLACK);
				add(bar, x, HEIGHT + 1 - barUnitHeight * v);
				GLabel lbl = new GLabel((String) o);
				lbl.setColor(Color.BLACK);
				// center label in bar
				add(lbl, x + (barWidth - lbl.getWidth()) / 2, HEIGHT);
				x = x + barWidth + GAP;
				// }
			}
		}

	}

	/**
	 * Opens a window with an example bar chart. You do not need to change this
	 * method!
	 * 
	 * @param args
	 *            command line arguments are not used in this exercise
	 */
	public static void main(String[] args) {
		BarChart b = new BarChart();
		b.start();

		Map<String, Double> data = new HashMap<String, Double>();
		data.put("0 - 4", 3.0);
		data.put("5 - 9", 7.0);
		data.put("10 - 14", 1.0);

		// TODO ggf. anpassen dieses Aufrufs, wenn der Methode oben
		// ein neuer Parameter hinzugefuegt wurde!

		// Yannic: Aufruf der setOrder Methode um Ausgabe nach Rubriken zu
		// ordnen
		LinkedList<String> o = new LinkedList<String>();
		o.add("0 - 4");
		o.add("5 - 9");
		o.add("10 - 14");
//		b.setOrder(o);
		b.displayDiagram(data, 10);
	}
}
